import { mergeLocalCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'
// 购物车状态
export default {
  namespaced: true,
  state: () => ({
    list: []
  }),
  getters: {
    /**
      1. 有效商品列表
      2. 选中的购物车商品数据
      3. 选中商品总价
      4. 购物车中有效商品是否是全部选中状态
     */

    // 1. 有效商品列表
    validList: state => {
      return state.list.filter(good => good.isEffective)
    },
    // 2.选中的商品列表
    selectedList: (state, getters) => {
      return getters.validList.filter(good => good.selected)
    },
    // 选中商品总价
    selectedTotal: (state, getters) => {
      return getters.selectedList.reduce((sum, good) => {
        return (sum += good.nowPrice * good.count)
      }, 0)
    },
    // 4. 购物车中有效商品是否是全部选中状态
    isAll (state, getters) {
      return getters.validList.every(good => good.selected)
    }
  },
  mutations: {
    addCart (state, good) {
      /**
     *
     * @param {*} state state内的变量
     * @param {*} good 需要加入的商品信息
     */
      /**
       * 根据skuId判断是否加入过
       * 1.未加入过 => 添加
       * 2.加入过 => 数量+1
       */
      const addedIndex = state.list.findIndex(item => {
        return item.skuId === good.skuId
      })
      // addedIndex !== -1 找到了 =》 数量+1
      if (addedIndex !== -1) {
        state.list[addedIndex].count += good.count
      } else {
        // 没找到 =》 添加进数组
        state.list.unshift(good)
      }
    },
    setSelected (state, { good, sel }) {
      const currGood = state.list.find(item => item.skuId === good.skuId)
      currGood.selected = sel
    },
    setIsAll (state, sel) {
      state.list.forEach(good => {
        good.selected = sel
      })
    },
    delGood (state, good) {
      const i = state.list.findIndex(item => {
        return item.skuId === good.skuId
      })
      state.list.splice(i, 1)
    },
    setCount (state, { good, countNum }) {
      const currGood = state.list.find(item => {
        return item.skuId === good.skuId
      })
      currGood.count = countNum
    },
    setCart (state, newList) {
      state.list = newList
    }
  },
  actions: {
    /**
     * 加入购物车action（异步）
     * 思路：区分是否登录=》1. 未登录，直接调用addCart存本地 2. 登陆了，调用接口存到数据库
     * @param {*} param { commit 调用mutations方法  rootState 获取任何模块下的state }
     * @param {*} good 需要添加的商品信息
     * return Promise对象
     */
    async addCartAction ({ commit, dispatch, rootState }, good) {
      // console.log('0000', rootState)
      if (rootState.user.profile.token) {
        // 登陆了
        await insertCart(good)
        dispatch('getListAction')
        return '加入购物车成功！'
      } else {
        // 未登录
        commit('addCart', good)
        // Promise对象
        return '加入购物车成功！'
      }
    },
    // 修改单选按钮状态
    async setSelectedAction ({ commit, rootState, dispatch }, { good, sel }) {
      if (rootState.user.profile.token) {
        // 登陆了
        await updateCart({ ...good, selected: sel })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('setSelected', { good, sel })
      }
    },
    // 修改多选按钮状态
    async setIsAllAction ({ commit, rootState, getters, dispatch }, sel) {
      if (rootState.user.profile.token) {
        // 登陆了
        const ids = getters.validList.map(item => item.skuId)
        await checkAllCart({ selected: sel, ids })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('setIsAll', sel)
        dispatch('getListAction')
      }
    },
    // 删除商品
    async delGoodAction ({ commit, rootState, dispatch }, good) {
      if (rootState.user.profile.token) {
        // 登陆了
        await deleteCart([good.skuId])
        dispatch('getListAction')
      } else {
        // 未登录
        commit('delGood', good)
      }
    },
    // 修改商品数量
    async setCountAction ({ commit, rootState, dispatch }, { good, countNum }) {
      if (rootState.user.profile.token) {
        // 登陆了
        await updateCart({ ...good, count: countNum })
        dispatch('getListAction')
      } else {
        // 未登录
        commit('setCount', { good, countNum })
      }
    },
    // 1.合并购物车
    async mergeCartAction ({ state, dispatch }) {
      /**
       * 登录成功后合并本地购物车数据到当前登录人名下
       *
       * 1. 判断本地是否有之前未登录添加的购物车商品数据
       * 2. 如果有调用接口进行合并
       * 3. 调用接口获取合并后最新的购物车数据（当前登录人）
       */
      if (state.list.length) {
        const mergeData = state.list.map(({ skuId, selected, count }) => {
          return {
            skuId, selected, count
          }
        })
        await mergeLocalCart(mergeData)
      }
      // 调用接口获取合并后最新的购物车数据
      dispatch('getListAction')
      console.log('购物车', state.list)
    },
    // 2.获取登陆后的购物车列表并更新vuex
    async getListAction ({ commit }) {
      const { result } = await findCartList()
      commit('setCart', result)
    }

  }
}
